home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / init.d / alsasound < prev    next >
Text File  |  2006-04-25  |  7KB  |  256 lines

  1. #!/sbin/runscript
  2. # $Header: /var/cvsroot/gentoo-x86/media-sound/alsa-utils/files/alsasound-1.0.10_rc2,v 1.2 2005/12/15 22:42:46 flameeyes Exp $
  3. #
  4. # Gentoo users: add this script to 'boot' run level.
  5. # ==================================================
  6. #
  7. # alsasound         This shell script takes care of starting and stopping
  8. #                   the ALSA sound driver.
  9. #
  10. # This script requires /usr/sbin/alsactl and /usr/bin/aconnect programs
  11. # from the alsa-utils package.
  12. #
  13. # Copyright (c) by Jaroslav Kysela <perex@suse.cz> 
  14. #
  15. #
  16. #  This program is free software; you can redistribute it and/or modify
  17. #  it under the terms of the GNU General Public License as published by
  18. #  the Free Software Foundation; either version 2 of the License, or
  19. #  (at your option) any later version.
  20. #
  21. #  This program is distributed in the hope that it will be useful,
  22. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24. #  GNU General Public License for more details.
  25. #
  26. #  You should have received a copy of the GNU General Public License
  27. #  along with this program; if not, write to the Free Software
  28. #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  29.  
  30. # ChangeLog:
  31. #
  32. # 2003.07.29 - John Mylchreest <johnm@gentoo.org>
  33. # Edited to support Linux kernel 2.5 and above as well as 2.4
  34. #
  35. # 2004.06.02 - Jeremy Huddleston <eradicator@gentoo.org>
  36. # Rewritten for better support for built-in drivers 
  37. #
  38. # 2004.10.29 - Jeremy Huddleston <eradicator@gentoo.org>
  39. # Cleaned up to work better for mixed builtin/module systems
  40. #
  41. # 2004.11.29 - Jeremy Huddleston <eradicator@gentoo.org>
  42. # Added save option thanks to Ben Anderson <roothorick@new.rr.com>
  43. #
  44. # 2005.04.21 - Jeremy Huddleston <eradicator@gentoo.org>
  45. # Added restore option and oss option.
  46. # Cleaned up code to use bash builtins instead of test.
  47.  
  48. alsactl=/usr/sbin/alsactl
  49. asoundcfg=/etc/asound.state
  50. aconnect=/usr/bin/aconnect
  51. alsascrdir=/etc/alsa.d
  52.  
  53. opts="${opts} save restore"
  54.  
  55. depend() {
  56.     need bootmisc localmount
  57.     after modules isapnp coldplug hotplug
  58. }
  59.  
  60. load_modules() {
  61.     # List of drivers for each card.
  62.     local DRIVERS="$(modprobe -c | grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | awk '{print $2}')"
  63.  
  64.     # Fall back on the automated aliases if we don't have ALSA configured properly...
  65.     if [[ -z "${DRIVERS}" && ! ( -d /proc/asound && -z "$(grep ' no soundcards ' /proc/asound/cards)" ) ]] ; then
  66.         ewarn "Could not detect custom ALSA settings.  Loading all detected alsa drivers."
  67.         DRIVERS="$(modprobe -c | grep pci: |  awk '{ print $3 }' | grep snd.* | sort | uniq)"
  68.         [[ -z "${DRIVERS}" ]] && eerror "Unable to find any ALSA drivers. Have you compiled alsa-drivers correctly?"
  69.     fi
  70.  
  71.     if [[ ${ENABLE_OSS_EMUL} == "yes" ]] && modprobe -c | grep -q "snd.*oss$" ; then
  72.         # Test for use of OSS
  73.         local OSS="$(modprobe -l | grep "snd.*oss" | sed -e "s:\/.*\/::" -e "s:\..*::")"
  74.         # Add oss modules to list
  75.         local i
  76.         for i in ${OSS}
  77.         do
  78.             DRIVERS="${DRIVERS} ${i}"
  79.         done
  80.     fi
  81.  
  82.     # We want to ensure snd-seq is loaded as it is needed for things like
  83.     # timidity even if we don't use a real sequencer.
  84.     DRIVERS="${DRIVERS} $(modprobe -l | grep "snd.seq\." | sed -e "s:\/.*\/::" -e "s:\..*::")"
  85.  
  86.     # We want to ensure snd-ioctl32 is loaded as it is needed for 32bit
  87.     # compatibility
  88.     DRIVERS="${DRIVERS} $(modprobe -l | grep "snd.ioctl32\." | sed -e "s:\/.*\/::" -e "s:\..*::")"
  89.  
  90.     local DRIVER
  91.     for DRIVER in ${DRIVERS}
  92.     do
  93.         if [[ "${DRIVER}" != "off"  &&
  94.               -z $(cut -d' ' -f1 /proc/modules | egrep "^${DRIVER}\$") &&
  95.               -z $(cut -d' ' -f1 /proc/modules | egrep "^${DRIVER//-/_}\$") ]] ; then
  96.             ebegin "  Loading: ${DRIVER}"
  97.             /sbin/modprobe ${DRIVER}
  98.             eend $?
  99.         fi
  100.     done
  101.         
  102.     sleep 1
  103.  
  104.     if [[ -f /proc/asound/seq/drivers ]] ; then
  105.         local SEQUENCERS="$(awk -F, '$2~/^empty$/ {print $1}' /proc/asound/seq/drivers)"
  106.         local SEQUENCER
  107.         for SEQUENCER in ${SEQUENCERS}
  108.         do
  109.             if [[ -z $(cut -d' ' -f1 /proc/modules | egrep "^${SEQUENCER}\$")  &&
  110.                   -z $(cut -d' ' -f1 /proc/modules | egrep "^${SEQUENCER//-/_}\$") ]] ; then
  111.                 ebegin "  Loading: ${SEQUENCER}"
  112.                 /sbin/modprobe ${SEQUENCER}
  113.                 eend $?
  114.             fi
  115.         done
  116.     fi
  117.         
  118.     for DRIVER in ${DRIVERS}
  119.     do
  120.         local TMP=${DRIVER##snd-}
  121.         TMP=${TMP##snd_}
  122.         if [[ -x "${alsascrdir}/${TMP}" ]] ; then
  123.             ebegin "  Running: ${alsascrdir}/${TMP}"
  124.             ${alsascrdir}/${TMP}
  125.             eend $?
  126.         fi
  127.     done
  128.         
  129.     if [[ ! -d /proc/asound || -n "$(grep ' no soundcards ' /proc/asound/cards)" ]] ; then
  130.         eerror "ERROR: Failed to load necessary drivers"
  131.     fi
  132. }
  133.  
  134. unload_modules() {
  135.     local LOADED_MODULES="$(/sbin/lsmod | grep -E "^snd" | awk '{print $1}')"
  136.     local MODULE
  137.     for MODULE in ${LOADED_MODULES}
  138.     do
  139.         /sbin/rmmod ${MODULE} >& /dev/null
  140.     done
  141.     /sbin/rmmod soundcore >& /dev/null
  142.     /sbin/rmmod gameport >& /dev/null    
  143.  
  144.     # Return success if the modules are unloaded
  145.     [[ -z "$(/sbin/lsmod | grep -E "^snd" | awk '{print $1}')" ]]
  146. }
  147.  
  148. terminate() {
  149.     #
  150.     # Kill processes holding open sound devices
  151.     #
  152.     # DEVS=`find /dev/ -follow -type c -maxdepth 1 -print 2>/dev/null | xargs ls -dils | grep "1*1[46]," | cut -d: -f2 | cut -d" " -f2; echo /proc/asound/dev/*`
  153.     local ossdevs="/dev/admmidi? /dev/adsp? /dev/amidi? /dev/audio* /dev/dmfm* \
  154.             /dev/dmmidi? /dev/dsp* /dev/dspW* /dev/midi0? /dev/mixer? /dev/music \
  155.             /dev/patmgr? /dev/sequencer* /dev/sndstat"
  156.     local alsadevs="/proc/asound/dev/* /dev/sound/* /dev/snd/*"
  157.     fuser -k ${ossdevs} ${alsadevs} >& /dev/null
  158.     
  159.     #
  160.     # remove all sequencer connections if any
  161.     #
  162.     [[ -f /proc/asound/seq/clients && -x ${aconnect} ]] && ${aconnect} --removeall
  163. }
  164.  
  165. restore_mixer() {
  166.     if [[ ${RESTORE_ON_START} == "no" ]] ; then
  167.         return 0
  168.     fi
  169.     
  170.     restore
  171. }
  172.  
  173. restore() {
  174.     ebegin "Restoring Mixer Levels"
  175.  
  176.     local val=0
  177.  
  178.     if [[ ! -r ${asoundcfg} ]] ; then
  179.         ewarn "No mixer config in ${asoundcfg}, you have to unmute your card!"
  180.     elif [[ -x ${alsactl} ]] ; then
  181.         local CARDS="$(cat /proc/asound/cards | awk '/: / { print $1 }')"
  182.         local CARDNUM
  183.         for CARDNUM in ${CARDS}
  184.         do
  185.             [[ -e /dev/snd/controlC0 ]] || sleep 2
  186.             [[ -e /dev/snd/controlC0 ]] || sleep 2
  187.             [[ -e /dev/snd/controlC0 ]] || sleep 2
  188.             [[ -e /dev/snd/controlC0 ]] || sleep 2
  189.             ${alsactl} -f ${asoundcfg} restore ${CARDNUM} || ewarn "Errors while restoring defaults, ignoring"
  190.         done
  191.     else
  192.         eerror -e "ERROR: Cannot find alsactl, did you forget to install media-sound/alsa-utils?"
  193.         val=1
  194.     fi
  195.  
  196.     eend ${val}
  197.     return ${val}
  198. }
  199.  
  200. save() {
  201.     ebegin "Storing ALSA Mixer Levels"
  202.  
  203.     local val=0
  204.     
  205.     if [[ -x ${alsactl} ]] ; then
  206.         ${alsactl} -f ${asoundcfg} store
  207.         val=$?
  208.     else
  209.         eerror -e "ERROR: Cannot find alsactl."
  210.         val=1
  211.     fi
  212.  
  213.     eend ${val}
  214.     return ${val}
  215. }
  216.  
  217. start() {
  218.     if [[ -f /proc/modules ]] ; then
  219.         ebegin "Loading ALSA modules"
  220.         if load_modules ; then
  221.             eend 0
  222.         else
  223.             eend 1
  224.             return 1
  225.         fi
  226.     fi
  227.     
  228.     if [[ ${RESTORE_ON_START} == "yes" ]]; then
  229.         restore_mixer
  230.     fi
  231. }
  232.  
  233. stop() {
  234.     if [[ ! -d /proc/asound ]] ; then
  235.         eerror "ALSA is not loaded"
  236.         return 0
  237.     fi
  238.     
  239.     if [[ ${SAVE_ON_STOP} == "yes" ]]; then
  240.         save
  241.     fi
  242.  
  243.     ebegin "Unloading ALSA"
  244.     terminate
  245.     eend 0
  246.  
  247.     if [[ -f /proc/modules ]]; then
  248.         ebegin "Unloading ALSA modules"
  249.         if unload_modules; then
  250.             eend 0
  251.         else
  252.             eend 1
  253.         fi
  254.     fi
  255. }
  256.